#include "ManejadorVotante.h"

using namespace Manejadores;

ManejadorVotante::ManejadorVotante() {
	Configuracion* config = Configuracion::getInstancia();
	string pathDeDatos = config->getNombreArchivoVotante();
	this->votantes = new ArchivoDeEstructurasVariables(pathDeDatos);
	this->indicePorDNI = new HashExtensible("IndicePorUnicidadDNI");
}

bool ManejadorVotante::alta(Votante* votante) {

	string claveDNI = Utils::convertirEnteroAString(votante->getDNI());

	if (!indicePorDNI->existe(claveDNI)) {
		unsigned int posicionDelRegistro = votantes->insertar(votante);
		indicePorDNI->insertar(claveDNI, posicionDelRegistro);
		indicePorDNI->exportarTxt("maru");
		return true;
	} else
		return false;
}

bool ManejadorVotante::baja(Votante* votante) {

	string claveDNI = Utils::convertirEnteroAString(votante->getDNI());
	IRegistroIndice* aBorrar = indicePorDNI->buscar(claveDNI);

	if (aBorrar->getOffsets()->size() > 0) {
		votantes->borrar(votante, aBorrar->getOffsets()->at(0));
		indicePorDNI->eliminar(claveDNI, aBorrar->getOffsets()->at(0));
		delete aBorrar;
		return true;
	} else
		return false;
}

bool ManejadorVotante::modificacion(Votante* votante) {
	string claveDNI = Utils::convertirEnteroAString(votante->getDNI());
	IRegistroIndice* viejaPosicion = indicePorDNI->buscar(claveDNI);
	unsigned int nuevaPosicion = votantes->modificar(votante,viejaPosicion->getOffsets()->at(0));
	if (viejaPosicion->getOffsets()->at(0) != nuevaPosicion) {
		indicePorDNI->modificar(claveDNI, viejaPosicion->getOffsets()->at(0),
				nuevaPosicion);
		return true;
	} else
		return false;
}

Votante* ManejadorVotante::recuperar(string claveVotante){

		IRegistroIndice* registro = this->indicePorDNI->buscar(claveVotante);
		if (registro->getOffsets()->size() > 0){
			Votante* votante = new Votante();
			this->votantes->leer(votante, registro->getOffsets()->at(0));
			delete registro;
			return votante;
		}else{
			delete registro;
			return NULL;
		}

}

ManejadorVotante::~ManejadorVotante() {
	delete this->votantes;
	delete this->indicePorDNI;
}
